module nade.cpu;

import std.string;

import nade.stack;


alias void delegate() Command;
alias Stack!(Command) CommandStack;


class CPU(D) {
	alias Stack!(D) DataStack;

	this()
	{
		makeCurrent();
	}

	void makeCurrent()
	{
		makeCurrent(this);
	}

	bool iterate()
	{
		makeCurrent();

		while(!_commandStack.empty)
		{
			_commandStack.pop()();

			if(_yeild)
			{
				_yeild = false;
				return false;
			}
		}

		return true;
	}

	void push(Command command)
	{
		_commandStack.push(command);
	}

	Command pop()
	{
		return _commandStack.pop();
	}

	void yeild()
	{
		_yeild = true;
	}

	private {
		CommandStack	_commandStack;
		DataStack		_dataStack;
		bool			_yeild = false;
	}
}

	// static {
		// void push(T)(T data)
		// {
			// assert(_current !is null);
			// static if(is(T == Command))
				// _current._commandStack.push(data);
			// else
				// _current._dataStack.push(cast(D)data);
		// }

		// T pop(T)()
		// {
			// assert(_current !is null);
			// static if(is(T == Command))
				// return _current._commandStack.pop();
			// else static if(is(T : Number)  ||  is(T : const(Number)))
				// return pop!(NumberCell)()._number;
			// else
				// return cast(T)_current._cellStack.pop();
		// }

		// void yeild()
		// {
			// assert(_current !is null);

			// _current._yeild = true;
		// }

		// private {
			// void makeCurrent(CPU cpu)
			// {
				// _current = cpu;
			// }

			// CPU!(D)			_current;
		// }
	// }
